package main

import (
	"fmt"
)

func division(a, b int) int {
	return a / b
}

// defer 被用来确保一个函数调用在程序执行结束前执行。
// 类比java的finally语句块，通常编写流的关闭逻辑（即用来执行一些清理工作）
func main() {
	fmt.Println("main result:", test()) // panic recover后，test方法返回零值
}

func test() bool {
	// 多个defer倒序执行（即：先声明的，靠后执行）
	defer func() { fmt.Println("I'm the first defer") }()

	defer func() {
		// 类比java的 try catch 逻辑，可以将go程序从未知的 panic 中恢复执行
		r := recover()
		if r != nil {
			// 处理panic
			fmt.Println("Recovered from panic:", r)
		}
	}()

	fmt.Println("Program begin")

	c := division(10, 0) // 出错，panic

	fmt.Println(c) // 此处不会执行到

	fmt.Println("Program end") // 此处不会执行到

	defer func() { fmt.Println("I'm the third defer, but i'm not printed") }() // 此处不会执行到
	return true
}
